I want to set the delegate of an object inside a class method in Objective-C. Pseudo-code:
+ (ClassWithDelegate*) myStaticMethod {
if (myObject == nil) {
myObject = [[ClassWithDelegate alloc] init];
// myObject.delegate = ?
}
return myObject;
}
In Java I would simply create an anonymous class that implemented the delegate protocol. How can I do something similar in Objective-C?
Basically I would like to avoid creating a separate class (and files) to implement a simple delegate protocol.
Anonymous classes can be implemented with library. Several months ago I have worked on
MMMutableMethods
fork to improve old implementation (discussing with author) and to add my own mechanism without any obj-c runtime manipulation.https://github.com/k06a/MMMutableMethods
A. First mechanism works on obj-c runtime class creation:
B. Second mechanism works on simple message forward implementation:
First one creates new obc-j classes in runtime, it allows you to create classes
MM_CREATE_CLASS(MM_REUSE, *)
and directly instances withMM_CREATE(MM_REUSE, *)
. Classes will be created only on first execution and reused by default, but you can avoid reusing by callingMM_CREATE_CLASS_ALWAYS(*)
andMM_CREATE_ALWAYS(*)
.The second mechanism doesn't creates any runtime instances, just remember blocks for selectors and forward method calls to them.
I prefere second way not to create a lot of classes in runtime. IMHO it is much safer and enough powerful.
To use this library just:
There are currently no anonymous classes in Objective-C.
Often you can use an already existing object. For instance, for an NSTableViewDataSource, you can implement the methods in the document or view controller and pass that as the delegate.
Or you can have the object itself implement the protocol and make it its own delegate in the default case.
Or the methods that send the delegate messages can check for a nil delegate and do something sensible in that situation.
Or you can declare and define a class inside the implementation file you are creating the object that needs a delegate.
As JeremyP has rightly said, There are no anonymous classes in Objective C like there are in Java.
But in Java, anonymous classes are mostly used to implement single method interface or what we also call as a functional interface.
We do it to avoid having to implement the interface** in a class **just for one method implementation which is most commonly used for Listeners, Observers and event handlers.
This is mostly done because of **lack of anonymous first class functions in Java (prior to version 8 and project lambda).
Objective C has something called as blocks, where you can directly pass a block which contains the implementation of that single method rather than an empty class wrapping it up.
Example:
A use of Anonymous Class in Java
In Objective C