我发布的通知中有一些问题:
[[NSNotificationCenter defaultCenter] postNotificationName:@"MobileProviderChanged"
object:self.selectedProviderID];
Run Code Online (Sandbox Code Playgroud)
不被我的观察者困住:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(onProviderChanged:)
name:@"MobileProviderChanged"
object:nil];
Run Code Online (Sandbox Code Playgroud)
完全相同的观察者在不同的ViewController中正常工作.
有关调试此方法的任何提示,以查看实际发布到defaultCenter的消息是什么?
谢谢.
我试图将NSString转换为iigned应用程序的unsigned char*.我是这个目标C和iphone应用的新手,所以请帮忙.是否有任何api可以帮助将NSString转换为unsigned char*.
谢谢,KamalBhr
我正在制作iPhone游戏.我想释放已分配或保留的所有对象.在dealloc我发布所有这些对象的函数中,但后来我意识到有时候我还没有分配对象时最终释放对象.所以我想retainCount在发布它之前我需要检查它是否大于零.
我的问题是:
我只是检查是否retainCount大于零,然后释放它?
if([bg retainCount]!=0)
{
[bg release];
}
Run Code Online (Sandbox Code Playgroud)
要么
我应该多次发布它 retainCount
while([bg retainCount]!=0)
{
[bg release];
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
创建数组变量有三种模式:
NSArray *array = @[@0, @1];
NSArray *array = [NSArray arrayWithObjects:@0, @1, nil];
NSArray *array = [[NSArray alloc] initWithObjects:@0, @1, nil];
当我使用第二种模式创建时,varialbe"array"将被抛给autoreleasepool; 当我使用第三个时,var的retainCount将为1但不会被抛给autoreleasepool; 我想知道第一种模式与第二种模式或第三种模式具有相同的效果;
@interface Foo : NSObject {
}
- (Bar)bar;
Run Code Online (Sandbox Code Playgroud)
在运行时,给定[Foo类],我们如何找出Foo所有方法的返回类型?
我一直在研究Objective-C运行时API; 据我所知,没有办法获得方法或属性的返回类型(即Class).这似乎是任何反射API中的一个严重遗漏.
我的主程序产生一个线程,执行以下命令:
// alloc autorelease pool somewhere before
NSArray *blah = [NSArray arrayWithObject: @"moo"];
[self performSelectorOnMainThread: @selector(boonk:) withObject: blah
waitUntilDone: NO];
// release autorelease pool somewhere after
Run Code Online (Sandbox Code Playgroud)
现在,这似乎对我来说是错误的,因为自动释放池可以在选择器boonk:完成执行之前释放,这会导致崩溃.
所以,我接下来的自然行动将是:
// alloc autorelease pool somewhere before
NSArray *blah = [[NSArray alloc] initWithObject: @"moo"];
[self performSelectorOnMainThread: @selector(boonk:) withObject: blah
waitUntilDone: NO];
// release autorelease pool somewhere after
- (void)boonk: (id)data
{
// do something with data
[data release]; // release the ref count the thread added
}
Run Code Online (Sandbox Code Playgroud)
这绝对没有错误,但......似乎不自然.是否有一个objective-c引用计数约定或协议来处理这种情况(交叉线程等待发布),或者是第二种解决方案,它的工作方式是什么?
multithreading memory-management conventions objective-c nsthread
我最近在这里读到,一个objective-c对象作为结构存储在堆上.该结构包含对象iVars,继承的iVars和isa指针.
我想弄清楚当我向这个对象发送消息时,运行时如何计算出要运行的代码?
我知道每个类都有一个类对象.这也存储在堆上吗?
我认为它的工作方式是运行时从结构中获取isa指针,使用它来调用类对象上的消息.它是否正确?
这里的问题更多的是教育问题.我在一小时前开始想到这一点,同时翻转一个乐高积木(傻,我知道).
根据我的理解,块是在堆栈上创建的对象.
让我们说A是一个对象,这意味着我们可以做到:
[A message];
Run Code Online (Sandbox Code Playgroud)
基于此,如果块是一个对象,我们也可以这样做:
[block message];
Run Code Online (Sandbox Code Playgroud)
我对么?
当运行时看到它时,它会调用:
objc_msgSend(block, @selector(message), nil);
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,我们如何发送一个消息块?
如果这是可能的,我会想象也可以发送一个块参数为块的消息?
并且,如果我们可以通过执行以下操作来调用块:
block();
Run Code Online (Sandbox Code Playgroud)
这是否意味着我们甚至可以将一个块作为message(SEL),因为块具有void (^)(void)类似于方法的签名?
因为如果有可能,那么下面的内容会让我感到惊讶:
objc_msgSend(block, @selector(block), block);
Run Code Online (Sandbox Code Playgroud)
要么:
objc_msgSend(block1, @selector(block2), block3);
Run Code Online (Sandbox Code Playgroud)
我希望我的想象力不会有点疯狂,我的理解不在这里(如果是的话,请纠正我).
macos objective-c objective-c-runtime ios objective-c-blocks
我一直在寻找一些为UITableView添加类类别的第三方代码; 接口添加了三个方法,但实现还包括-dealloc方法的代码(以及其他辅助方法).
我对类类别并不是很熟悉 - 除了这看起来像是一件坏事之外,它是否会覆盖所有UITableView实例的-dealloc方法 - 即使类别不是由特定类导入(比如ViewController)实例化UITableView?
我正在使用NSXPCConnection,而我的接口调用之一有一个回复块,如下所示:
- (void)addItem:(NSData *) withLabel:(NSString *) reply:(void (^)(NSInteger rc))reply;
Run Code Online (Sandbox Code Playgroud)
我这样称呼:
__block NSInteger status;
[proxy addItem:data withLabel:@"label" reply:^(NSInteger rc)
{
status = rc;
}
];
Run Code Online (Sandbox Code Playgroud)
我的理解是,答复块异步运行,并且有可能在方法返回后运行。
我想同步测试返回码,最好的方法是什么?
为了进一步阐明上面的代码段:proxy对象是NSXPCConnection使用该remoteObjectProxy方法从对象获得的远程对象。这是一个重要的细节,因为这会影响应答块在哪个队列上的调用。
objective-c ×8
ios ×4
iphone ×3
cocoa ×2
arrays ×1
conventions ×1
debugging ×1
macos ×1
nsstring ×1
nsthread ×1
reflection ×1
retain ×1
retaincount ×1
runtime ×1
xpc ×1